<html>
 <head>
  <meta charset="UTF-8">
 </head>
 <body>
  <h1 data-lake-id="K2pgl" id="K2pgl"><span data-lake-id="u196f832c" id="u196f832c">典型回答</span></h1>
  <p data-lake-id="u8cd42f47" id="u8cd42f47"><br></p>
  <p data-lake-id="u34c126a4" id="u34c126a4"><span data-lake-id="ufcb92508" id="ufcb92508">Ribbon是Netflix推出的负载均衡组件，</span><strong><span data-lake-id="u8e0ca2c0" id="u8e0ca2c0">但是从2020年开始，Netflix推出的很多SpringCloud组件都宣布不再更新维护了</span></strong><span data-lake-id="u423aa588" id="u423aa588">，所以，SpringCloud就自己推出了Spring Cloud LoadBalancer 来代替Ribbon，所以，在Spring Cloud 2020.0版本中，Ribbon已经被标记为过时，官方推荐使用Spring Cloud LoadBalancer。</span></p>
  <p data-lake-id="u65acfe28" id="u65acfe28"><span data-lake-id="u2207de6a" id="u2207de6a">​</span><br></p>
  <p data-lake-id="u9c7ebb29" id="u9c7ebb29"><span data-lake-id="ub0689636" id="ub0689636">LoadBalancer是Spring Cloud官方提供的负载均衡组件，可用于替代Ribbon。其使用方式与Ribbon基本兼容，可以从Ribbon进行平滑过渡。</span></p>
  <p data-lake-id="u43e9bc5d" id="u43e9bc5d"><span data-lake-id="u9b4854a3" id="u9b4854a3">​</span><br></p>
  <p data-lake-id="u29b1b7e5" id="u29b1b7e5"><span data-lake-id="u822c0254" id="u822c0254">其实LoadBalancer就是Ribbon的替代品，二者在功能和使用上没什么太大的差别，如果一定要说一说他们之间的差别的话，主要有这几个：</span></p>
  <p data-lake-id="u663a4f5d" id="u663a4f5d"><span data-lake-id="u00a5d6ff" id="u00a5d6ff">​</span><br></p>
  <ol list="uce2c0c5e">
   <li fid="u42388af1" data-lake-id="ubeea2b5b" id="ubeea2b5b"><span data-lake-id="u704b63ef" id="u704b63ef">实现方式：Ribbon是一个独立的第三方的库，需要单独引入。而Spring Cloud LoadBalancer是Spring Cloud的一个组件，集成在Spring Cloud中，可以直接使用。</span></li>
   <li fid="u42388af1" data-lake-id="u3d57f757" id="u3d57f757"><span data-lake-id="ua19b89b6" id="ua19b89b6">易用性：Ribbon是一个较为底层的负载均衡器，需要开发人员手动配置负载均衡策略和服务发现机制。而Spring Cloud LoadBalancer提供了一个更高层次的抽象，将负载均衡策略和服务发现机制的实现进行了封装，使开发人员更容易使用。</span></li>
   <li fid="u42388af1" data-lake-id="u8e869b82" id="u8e869b82"><span data-lake-id="udd8e74b5" id="udd8e74b5">生态完整：Spring Cloud LoadBalancer与Spring Cloud的其他组件紧密集成，具有更好的易用性和稳定性，而且与Ribbon相比，更加轻量级，性能更好。</span></li>
  </ol>
  <p data-lake-id="u9ab45357" id="u9ab45357"><span data-lake-id="ucaafc962" id="ucaafc962">​</span><br></p>
  <h1 data-lake-id="GiTds" id="GiTds"><span data-lake-id="uf3b35709" id="uf3b35709">扩展知识</span></h1>
  <p data-lake-id="u34d2f8a6" id="u34d2f8a6"><br></p>
  <h2 data-lake-id="nRVBt" id="nRVBt"><span data-lake-id="ud0e13844" id="ud0e13844">使用示例</span></h2>
  <p data-lake-id="u77f93334" id="u77f93334"><br></p>
  <p data-lake-id="u25056880" id="u25056880"><span data-lake-id="u3c18df87" id="u3c18df87">在项目的pom.xml文件中添加以下依赖：</span></p>
  <p data-lake-id="u4f102d26" id="u4f102d26"><span data-lake-id="ucd6eaaac" id="ucd6eaaac">​</span><br></p>
  <pre lang="java"><code>
&lt;dependency&gt;
    &lt;groupId&gt;org.springframework.cloud&lt;/groupId&gt;
    &lt;artifactId&gt;spring-cloud-starter-loadbalancer&lt;/artifactId&gt;
&lt;/dependency&gt;
</code></pre>
  <p data-lake-id="u4835a8c8" id="u4835a8c8"><span data-lake-id="u731cbf5f" id="u731cbf5f">​</span><br></p>
  <p data-lake-id="u7d082eca" id="u7d082eca"><span data-lake-id="u25792d63" id="u25792d63">​</span><br></p>
  <p data-lake-id="uc90edca5" id="uc90edca5"><span data-lake-id="u3618e236" id="u3618e236">创建一个RestTemplate对象，并使用@LoadBalanced注解进行标记：</span></p>
  <p data-lake-id="u77f4cbb6" id="u77f4cbb6"><span data-lake-id="u25e27072" id="u25e27072">​</span><br></p>
  <pre lang="java"><code>
@Configuration
public class AppConfig {
    @Bean
    @LoadBalanced
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }
}
</code></pre>
  <p data-lake-id="u4433c019" id="u4433c019"><br></p>
  <p data-lake-id="u3acec957" id="u3acec957"><span data-lake-id="u94d7ce7f" id="u94d7ce7f">实现服务调用：</span></p>
  <p data-lake-id="u6e1decf9" id="u6e1decf9"><span data-lake-id="ud32d9dc5" id="ud32d9dc5">​</span><br></p>
  <pre lang="java"><code>
@Service
public class MyService {
    @Autowired
    private RestTemplate restTemplate;

    public String callService() {
        String url = "http://my-service/my-api";
        return restTemplate.getForObject(url, String.class);
    }
}
</code></pre>
  <p data-lake-id="ub2bdce7e" id="ub2bdce7e"><br></p>
  <p data-lake-id="u6723cefb" id="u6723cefb"><span data-lake-id="u56ed5fc9" id="u56ed5fc9">在上面的示例中，在实际调用时，会从提供"my-service"的服务提供者中，自动选择一个可用的实例进行服务调用。</span></p>
  <p data-lake-id="u684f9262" id="u684f9262"><span data-lake-id="u76c80d97" id="u76c80d97">​</span><br></p>
  <p data-lake-id="u0c9d3365" id="u0c9d3365"><span data-lake-id="u8ab2f78c" id="u8ab2f78c">Spring Cloud LoadBalancer默认提供了一些常见的负载均衡算法，例如轮询、随机等。如果需要选择其他复杂的负载均衡算法，可以通过在应用程序配置文件中指定配置属性来进行设置：</span></p>
  <p data-lake-id="ucc62be22" id="ucc62be22"><br></p>
  <pre lang="java"><code>
spring.cloud.loadbalancer.configurations.my-service=random
</code></pre>
  <p data-lake-id="u3459547e" id="u3459547e"><span data-lake-id="u766160fb" id="u766160fb">​</span><br></p>
  <p data-lake-id="ube45fe3f" id="ube45fe3f"><span data-lake-id="u01159710" id="u01159710">或者使用注解</span><span data-lake-id="u03c340eb" id="u03c340eb" class="lake-fontsize-12" style="color: rgb(52, 53, 65)">@LoadBalancerClient </span></p>
  <p data-lake-id="u025da751" id="u025da751"><span data-lake-id="u6482c09b" id="u6482c09b" class="lake-fontsize-12" style="color: rgb(52, 53, 65)">​</span><br></p>
  <pre lang="java"><code>
@Configuration
@LoadBalancerClient(name = "my-service", configuration = RandomLoadBalancerConfig.class)
public class AppConfig {
    @Bean
    @LoadBalanced
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }
}
</code></pre>
 </body>
</html>